package com.atguigu.bigdata.scala.chapter07

import scala.io.{BufferedSource, Source}

object Scala12_Collection_WordCount_Test {

    def main(args: Array[String]): Unit = {

        // TODO - WordCount
        val list = List(
            ("hello", 4),
            ("hello spark", 3),
            ("hello spark scala", 2),
            ("hello spark scala hive", 1)
        )
        // 1. （元素1，元素2，元素3）=> 元组
        // 2. (元素1，元素2) => 对偶元组 => 键值对
        // 3. List( (元素1， 元素2) ) => 集合中的每一个元素是元组 => key可以重复
        // 4. Map( (元素1， 元素2) ) => 集合中的每一个元素是键值对 => key不能重复 => Key - Value是独立的，一般不做整体使用
        // 5. 元组中第一个元素表示字符串，第二歌元素表示字符串出现的次数

        // TODO 第一种方式实现WordCount
        /*
        val list = List(
            ("hello", 4),
            ("hello spark", 3),
            ("hello spark scala", 2),
            ("hello spark scala hive", 1)
        )
        ====>
        val list1 = List(
               "Hello",
               "Hello Scala",
               "Hello Scala World"
           )
        ====>
        val list1 = List(
               "Hello Hello Hello Hello",
               "Hello World Hello World Hello World",
               "Hello Scala World Hello Scala World"
           )

           可以通过集合的转换，映射的方式将集合中的元素从A => B

           map方法在业务处理中使用的最多
         */
        val newlist = list.map(
            (t) => {
                // 字符串提供了一个方法：*， 可以将字符串重复生成
                val str = t._1
                val cnt = t._2
                (str + " ") * cnt
            }
        )
        //println("new list = " + newlist)
        newlist
            .flatMap(_.split(" "))
            .groupBy( word=>word ) // 如果参数原封不动返回，那么不能简化
            .map(t => {(t._1, t._2.size)})
            .toList
            .sortBy(_._2)(Ordering.Int.reverse)
            .take(3)
            .foreach(println)
    }
}
